package 泛型;

//public class 泛型实例化1 {
//
//}
/*
Java 泛型的实例化总结
前言： 当我们在做项目的时候 ，搭建框架的时候，会经常用到泛型类来封装一些通用类或工具类。在封装泛型类的过程中，为了提升开发效率及代码简洁，会经常运用泛型内部进行实例化，用以减少代码量或重复操作。

创建泛型类*/
/*
public class GenericityTest<T,D,E> {
   T t;
   D d;
   E e;
｝
*/
/*1 泛型的实例化
（1）getClass().getGenericSuperclass()).getActualTypeArguments()[0].newInstance();

   public void init(){

      try {
         Type[] typeArguments = ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments();
         for(Type type : typeArguments){
            System.out.println("type:"+type);//打印映射的实际类
         }
         Class<T> tClass = (Class<T>) typeArguments[0];
         Class<D> dClass = (Class<D>) typeArguments[1];
         Class<E> cClass = (Class<E>) typeArguments[2];
         this.t = tClass.newInstance();
         this.d = dClass.newInstance();
         this.e = cClass.newInstance();
      } catch ( Exception e) {
         e.printStackTrace();
      }
   }
*/
/*
(2) getConstructor().newInstance()
public void init(){

      try {
         Type[] typeArguments = ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments();
         for(Type type : typeArguments){
            System.out.println("type:"+type);
         }
         T e = (T) ((Class)typeArguments[0]).getConstructor().newInstance();
         D e = (D) ((Class)typeArguments[1]).getConstructor().newInstance();
         E e = (E) ((Class)typeArguments[2]).getConstructor().newInstance();
      } catch ( Exception e) {
         e.printStackTrace();
      }
   }
*/
/*
(3) Class.forName(className).newInstance()

   public void init(){

      try {
         Type[] typeArguments = ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments();
         for(Type type : typeArguments){
            System.out.println("type:"+type);//打印映射的实际类
         }
         T t = (T) Class.forName(typeArguments[0].getTypeName()).newInstance();
         D d = (D) Class.forName(typeArguments[1].getTypeName()).newInstance();
         E e = (E) Class.forName(typeArguments[2].getTypeName()).newInstance();
      } catch ( Exception e) {
         e.printStackTrace();
      }
   }
*/
//2 注意的是
//泛型的实例化不能用于抽象类、接口、数组类、基本类型或void，以及泛型类；
//泛型类的泛型类 是什么意思？
//例如： HashMap<String,String> 这些方法都不能创建出该对象，如果只是HashMap可以，HashMap<String,String>就不行


